package LeetCode._01算法入门.day07广度深度优先搜索;

import utils.MyPrintUtil;

/**
 * @author 挚爱之夕
 * @date 2022-02-27 - 02 - 27 - 9:55
 * @Description 有一幅以二维整数数组表示的图画，每一个整数表示该图画的像素值大小，数值在 0 到 65535 之间。
 * 给你一个坐标(sr, sc)表示图像渲染开始的像素值（行 ，列）和一个新的颜色值newColor，让你重新上色这幅图像。
 * 为了完成上色工作，从初始坐标开始，记录初始坐标的上下左右四个方向上像素值与初始坐标相同的相连像素点，
 * 接着再记录这四个方向上符合条件的像素点与他们对应四个方向上像素值与初始坐标相同的相连像素点，……，重复该过程。
 * 将所有有记录的像素点的颜色值改为新的颜色值。最后返回经过上色渲染后的图像。
 * @Version 简单
 */
public class _733图像渲染 {
    public static void main(String[] args) {
        int[][] image = {
                {1, 1, 1},
                {1, 1, 0},
                {1, 0, 1}
//                {0, 0, 0},
//                {0, 1, 1}
        };
        int sr = 1;
        int sc = 1;
        int newColor = 2;
//        int sr = 1;
//        int sc = 1;
//        int newColor = 1;
        int[][] res = floodFill(image, sr, sc, newColor);
        MyPrintUtil.printArray(res);
    }

    public static int[][] floodFill(int[][] image, int sr, int sc, int newColor) {
        floodFillRecursion(image, sr, sc, newColor, image[sr][sc]);
        return image;
    }

    public static void floodFillRecursion(
            int[][] image, int sr, int sc, int newColor, int val) {
        //新颜色和旧颜色一样，染个der
        if(val == newColor)
            return;
        //越界或像素值与初始坐标的像素值不相同
        if (!(sr >= 0 && sr < image.length)
                || !(sc >= 0 && sc < image[0].length)
                || image[sr][sc] != val
                ) {
            return;
        }
        //染色
        image[sr][sc] = newColor;
        //上
        floodFillRecursion(image, sr, sc - 1, newColor, val);
        //下
        floodFillRecursion(image, sr, sc + 1, newColor, val);
        //左
        floodFillRecursion(image, sr - 1, sc, newColor, val);
        //右
        floodFillRecursion(image, sr + 1, sc, newColor, val);
    }
}
